// 钩子机制
package file

// Hook 接口定义文件操作钩子
type Hook interface {
	BeforeOpen(path string, mode string) error
	AfterOpen(file value.File) error
	BeforeClose(file value.File) error
	AfterClose(err error) error
}

// 全局钩子注册表
var hooks []Hook

// RegisterHook 注册文件操作钩子
func RegisterHook(hook Hook) {
	hooks = append(hooks, hook)
}

// Open 文件时调用钩子
func Open(path string, mode string) (value.File, error) {
	// 调用 BeforeOpen 钩子
	for _, hook := range hooks {
		if err := hook.BeforeOpen(path, mode); err != nil {
			return nil, err
		}
	}

	file, err := localOpen(path, mode)
	if err != nil {
		return nil, err
	}

	// 调用 AfterOpen 钩子
	for _, hook := range hooks {
		if err := hook.AfterOpen(file); err != nil {
			file.Close() // 出错时关闭文件
			return nil, err
		}
	}

	return file, nil
}
